/**
 * 公用提示窗
 *
 * @export
 * @param {string} [desc='确认操作'] 弹框提示文字
 * @param {string} [title='提示'] 弹框标题
 * @param {string} [confirmButtonName='确认'] 确认按钮文字
 * @param {string} [cancelButtonName='取消'] 取消按钮文字
 * @param {boolean} [distinguishCancelAndClose=false] 关系和取消是否执行同一方法
 * @returns
 */
export function confirm(
  desc = '确认操作',
  type = 'info',
  title = '提示',
  confirmButtonName = '确认',
  cancelButtonName = '取消',
  distinguishCancelAndClose = false
) {
  return this.$confirm(desc, title, {
    confirmButtonText: confirmButtonName,
    cancelButtonText: cancelButtonName,
    distinguishCancelAndClose: distinguishCancelAndClose,
    closeOnClickModal: false,
    type: type

    //  center: true
  })
}

/**
 *
 *
 * @export
 * @param {string} [desc='请输入内容']
 * @param {string} [title='修改']
 * @param {string} [inputType="text"]
 * @param {string} [inputValue=""]
 * @param {string} [reg='/\S/']
 * @param {string} [inputErrorMessage="格式不正确"]
 * @param {string} [confirmB='确定']
 * @param {string} [cancelB='取消']
 * @returns
 */
export function prompt(
  desc = '请输入内容',
  title = '修改',
  inputType = 'text',
  inputValue = '',
  reg = /\S/,
  inputErrorMessage = '格式不正确',
  confirmB = '确定',
  cancelB = '取消'
) {
  return this.$prompt(desc, title, {
    inputType: inputType,
    inputValue: inputValue,
    confirmButtonText: confirmB,
    cancelButtonText: cancelB,
    inputPattern: reg,
    inputErrorMessage: inputErrorMessage,
    closeOnClickModal: false
  })
}

/**
 *
 *
 * @export
 * @param {string} str 要转义的字符
 * @returns
 */
export function filterXSS(str) {
  return str
    .replace(/&/g, '&amp;')
    .replace(/ /g, '&nbsp;')
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;')
    .replace(/"/g, '&quot;')
    .replace(/'/g, '&#39;')
    .replace(/\r{0,}\n/g, '<br/>')
}

/**
 *
 *
 * @export
 * @param {string} [text='服务器异常']
 * @param {string} [type='error']
 */
export function message(text = '服务器异常', type = 'error', code) {
  if (code) {
    type = code === '00000' ? 'success' : 'error'
  }
  this.$message({
    message: text,
    showClose: true,
    type: type,
    duration: '2000'
  })
}

/**
 * Check if an element has a class
 * @param {HTMLElement} elm
 * @param {string} cls
 * @returns {boolean}
 */
export function hasClass(ele, cls) {
  return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'))
}

/**
 * Add class to element
 * @param {HTMLElement} elm
 * @param {string} cls
 */
export function addClass(ele, cls) {
  if (!hasClass(ele, cls)) ele.className += ' ' + cls
}

/**
 * Remove class from element
 * @param {HTMLElement} elm
 * @param {string} cls
 */
export function removeClass(ele, cls) {
  if (hasClass(ele, cls)) {
    const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)')
    ele.className = ele.className.replace(reg, ' ')
  }
}

//  判断是否包含
export function isInArray(arr, value) {
  if (arr.indexOf && typeof arr.indexOf == 'function') {
    let index = arr.indexOf(value)
    if (index >= 0) {
      return true
    }
  }
  return false
}

// 判断数组是否有重复项
export function isRepeat(arr) {
  let hash = {}
  for (let i in arr) {
    if (hash[arr[i]]) {
      return true
    }
    hash[arr[i]] = true
  }
  return false
}

//  数组指定项删除
export function removeByValue(arr, val) {
  for (let i = 0; i < arr.length; i++) {
    if (JSON.stringify(arr[i]).indexOf(JSON.stringify(val)) != -1) {
      arr.splice(i, 1)
      break
    }
  }
}

/**
 *
 *去重
 * @export
 * @param {*} arr
 * @returns
 */
export function uniqueArr(arr) {
  let res = [...new Set(arr)]
  return res
}

/**
 *
 *
 * @export
 * @param {*} data
 * @param {*} filename
 */
export function downLoadXls(data, filename) {
  // let blob = new Blob([data], {type: 'application/vnd.ms-excel'})接收的是blob，若接收的是文件流，需要转化一下
  if (typeof window.chrome !== 'undefined') {
    //  Chrome version
    let link = document.createElement('a')
    link.href = window.URL.createObjectURL(data)
    link.download = filename
    link.click()
  } else if (typeof window.navigator.msSaveBlob !== 'undefined') {
    //  IE version
    let blob = new Blob([data], {
      type: 'application/force-download'
    })
    window.navigator.msSaveBlob(blob, filename)
  } else {
    //  Firefox version
    let file = new File([data], filename, {
      type: 'application/force-download'
    })
    window.open(URL.createObjectURL(file))
  }
}

export const myRegExp = {
  //  检查字符串是否为合法QQ号码
  isQQ: function(str) {
    //  1 首位不能是0  ^[1-9]
    //  2 必须是 [5, 11] 位的数字  \d{4, 9}
    let reg = /^[1-9][0-9]{4,9}$/gim
    return reg.test(str)
  },
  //  检查字符串是否为合法手机号码
  isPhone: function(str) {
    let reg = /^(?:(?:\+|00)86)?1\d{10}$/
    return reg.test(str)
  },
  //  检查字符串是否为合法Email地址
  isEmail: function(str) {
    //  eslint-disable-next-line no-useless-escape
    let reg = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/
    return reg.test(str)
  },
  //  检查字符串是否是数字
  isNumber: function(str) {
    let reg = /^\d+$/
    return reg.test(str)
  },
  //  检查字符串是否存在中文
  isChinese: function(str) {
    let reg = /[\u4e00-\u9fa5]/gm
    return reg.test(str)
  },
  //  检查字符串是否为合法邮政编码
  isPostcode: function(str) {
    //  起始数字不能为0，然后是5个数字  [1-9]\d{5}
    let reg = /^[1-9]\d{5}$/g
    //  let reg = /^[1-9]\d{5}(?!\d)$/;
    return reg.test(str)
  },
  //  检查字符串是否为合法身份证号码
  isIDcard: function(str) {
    let reg = /^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/
    return reg.test(str)
  },
  //  检查字符串是否为合法URL
  isURL: function(str) {
    let reg = /^(((ht|f)tps?):\/\/)?[\w-]+(\.[\w-]+)+([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?$/
    return reg.test(str)
  },
  //  检查字符串是否为合法日期格式 yyyy-mm-dd
  isDate: function(str) {
    let reg = /^[1-2][0-9][0-9][0-9]-[0-1]{0,1}[0-9]-[0-3]{0,1}[0-9]$/
    return reg.test(str)
  },
  //  检查字符串是否为合法IP地址
  isIP: function(str) {
    //  1.1.1.1  四段  [0 , 255]
    //  第一段不能为0
    //  每个段不能以0开头
    //
    //  本机IP: 58.50.120.18 湖北省荆州市 电信
    let reg = /^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/gi
    return reg.test(str)
  },
  // 是否为包名
  isPackageName: function(str) {
    //  eslint-disable-next-line no-useless-escape
    let reg = /([a-zA-Z]+[.])[.]*[0-9A-Za-z\.]+/i
    return reg.test(str)
  },
  isPort: function(str) {
    let reg = /^([0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$/
    return reg.test(str)
  },
  isMac: function(str) {
    let reg = /^([0-9a-fA-F]{2})(([/\s:][0-9a-fA-F]{2}){5})$/
    return reg.test(str)
  },

  /**
   * 判断是否是数字、英文、特殊符号2种或2种以上组合
   * @param {*} str
   * @param {*} startNum：最少多少位
   * @param {*} endNum：最高多少位
   * @returns
   */
  isNumAndSymbolAndLetter(str, startNum, endNum) {
    let reg = new RegExp(
      '^(?![0-9]+$)(?![a-zA-Z]+$)(?!([^(0-9a-zA-Z)]|[()])+$)([^(0-9a-zA-Z)]|[()]|[a-zA-Z]|[0-9]){' +
      startNum +
      ',' +
      endNum +
      '}$'
    )
    return reg.test(str)
  }
}

export function getBeforeDate(n) {
  let d = new Date()
  let year = d.getFullYear()
  let mon = d.getMonth() + 1
  let day = d.getDate()
  if (day <= n) {
    if (mon > 1) {
      mon = mon - 1
    } else {
      year = year - 1
      mon = 12
    }
  }
  d.setDate(d.getDate() - n)
  year = d.getFullYear()
  mon = d.getMonth() + 1
  day = d.getDate()
  let s =
    year +
    '-' +
    (mon < 10 ? '0' + mon : mon) +
    '-' +
    (day < 10 ? '0' + day : day)
  return s
}

/**
 * 对Date的扩展，将 Date 转化为指定格式的String
 * 月(M)、日(d)、12小时(h)、24小时(H)、分(m)、秒(s)、周(E)、季度(q) 可以用 1-2 个占位符
 * 年(y)可以用 1-4 个占位符，毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
 * eg:
 * (new Date()).pattern("yyyy-MM-dd hh:mm:ss.S") ==> 2007-07-02 08:09:04.423
 * (new Date()).pattern("yyyy-MM-dd E HH:mm:ss") ==> 2007-03-10 二 20:09:04
 * (new Date()).pattern("yyyy-MM-dd EE hh:mm:ss") ==> 2007-03-10 周二 08:09:04
 * (new Date()).pattern("yyyy-MM-dd EEE hh:mm:ss") ==> 2007-03-10 星期二 08:09:04
 * (new Date()).pattern("yyyy-M-d h:m:s.S") ==> 2007-7-2 8:9:4.18
 */

Date.prototype.format = function(fmt) {
  let o = {
      'M+': this.getMonth() + 1,
      // 月份
      'd+': this.getDate(),
      // 日
      'h+': this.getHours() % 12 == 0 ? 12 : this.getHours() % 12,
      // 小时
      'H+': this.getHours(),
      // 小时
      'm+': this.getMinutes(),
      // 分
      's+': this.getSeconds(),
      // 秒
      'q+': Math.floor((this.getMonth() + 3) / 3),
      // 季度
      S: this.getMilliseconds() // 毫秒
    },
    week = {
      '0': '\u65e5',
      '1': '\u4e00',
      '2': '\u4e8c',
      '3': '\u4e09',
      '4': '\u56db',
      '5': '\u4e94',
      '6': '\u516d'
    }

  if (/(y+)/.test(fmt)) {
    fmt = fmt.replace(
      RegExp.$1,
      (this.getFullYear() + '').substr(4 - RegExp.$1.length)
    )
  }

  if (/(E+)/.test(fmt)) {
    fmt = fmt.replace(
      RegExp.$1,
      (RegExp.$1.length > 1
        ? RegExp.$1.length > 2
          ? '\u661f\u671f'
          : '\u5468'
        : '') + week[this.getDay() + '']
    )
  }

  for (let k in o) {
    if (new RegExp('(' + k + ')').test(fmt)) {
      fmt = fmt.replace(
        RegExp.$1,
        RegExp.$1.length == 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length)
      )
    }
  }

  return fmt
}

/**
 * @param {Function} func
 * @param {number} wait
 * @param {boolean} immediate
 * @return {*}
 */
export function debounce(func, wait, immediate) {
  let timeout, args, context, timestamp, result

  const later = function() {
    //  据上一次触发时间间隔
    const last = +new Date() - timestamp

    //  上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait
    if (last < wait && last > 0) {
      timeout = setTimeout(later, wait - last)
    } else {
      timeout = null
      //  如果设定为immediate===true，因为开始边界已经调用过了此处无需调用
      if (!immediate) {
        result = func.apply(context, args)
        if (!timeout) context = args = null
      }
    }
  }

  return function(...args) {
    context = this
    timestamp = +new Date()
    const callNow = immediate && !timeout
    //  如果延时不存在，重新设定延时
    if (!timeout) timeout = setTimeout(later, wait)
    if (callNow) {
      result = func.apply(context, args)
      context = args = null
    }

    return result
  }
}

export function exportFileFun(obj, name) {
  if ('msSaveOrOpenBlob' in navigator) {
    // ie使用的下载方式
    window.navigator.msSaveOrOpenBlob(obj, name)
  } else {
    const link = document.createElement('a')
    let blob = new Blob([obj], {
      type: 'application/vnd.ms-excel'
    })
    link.style.display = 'none'
    link.href = URL.createObjectURL(blob)
    //  link.download = obj.header["Content-Disposition"]; // 下载后文件名
    link.download = name // 下载的文件名
    document.body.appendChild(link)
    link.click()
    document.body.removeChild(link)
  }
}

export function checkBetweenTime(startArr, endArr) {
  let begin = startArr.sort()
  let over = endArr.sort()
  console.log(begin)
  console.log(over)
  for (let k = 1; k < begin.length; k++) {
    if (begin[k] < over[k - 1]) {
      return false
    }
  }
  return true
}

export function checkBetweenDate(datePart, obj) {
  let flag = true

  for (let j = 0; j < datePart.length - 1; j++) {
    //  时间段不同，日期相同
    if (
      datePart[j + 1][0] == datePart[j][0] ||
      datePart[j + 1][1] == datePart[j][1]
    ) {
      let startArr = [...obj[j].beginTimes, ...obj[j + 1].beginTimes]
      let endArr = [...obj[j].endTimes, ...obj[j + 1].endTimes]
      flag = checkBetweenTime(startArr, endArr)
      return flag
    }
    // 日期不同
    if (datePart[j + 1][0] < datePart[j][1]) {
      if (datePart[j + 1][1] > datePart[j][0]) {
        flag = false
        return false
      }
    }
  }
  return flag
}

/**
 *
 *
 * @export
 * @param {*} data 数组
 * @param {*} [keys=[]] 值
 * @returns
 */
export function sort_pro(data, keys = []) {
  let c = []
  let d = {}
  for (let element of data) {
    let element_keyStr = ''
    let element_key = []
    let element_keyObj = {}
    for (let key of keys) {
      element_key.push(element[key])
      element_keyObj[key] = element[key]
    }
    element_keyStr = element_key.join('_')
    if (!d[element_keyStr]) {
      c.push({
        ...element_keyObj,
        children: [element]
      })
      d[element_keyStr] = element
    } else {
      for (let ele of c) {
        let isTrue = keys.some(key => {
          return ele[key] != element[key]
        })
        if (!isTrue) {
          ele.children.push(element)
        }
      }
    }
  }
  return c
}

function dateFormat(fmt, date) {
  const o = {
    'M+': date.getMonth() + 1, // 月份
    'd+': date.getDate(), // 日
    'h+': date.getHours(), // 小时
    'm+': date.getMinutes(), // 分
    's+': date.getSeconds(), // 秒
    'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
    'S': date.getMilliseconds() // 毫秒
  }
  if (/(y+)/.test(fmt)) {
    fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
  }
  for (var k in o) {
    if (new RegExp('(' + k + ')').test(fmt)) {
      fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)))
    }
  }
  return fmt
}

export function getCurrentTime() {
  return dateFormat('yyyyMMddhhmmss', new Date())
}

function guid() {
  var s = []
  var hexDigits = '0123456789abcdef'
  for (var i = 0; i < 36; i++) {
    s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1)
  }
  s[14] = '4' // bits 12-15 of the time_hi_and_version field to 0010
  s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1) // bits 6-7 of the clock_seq_hi_and_reserved to 01
  s[8] = s[13] = s[18] = s[23] = '-'

  var uuid = s.join('')
  return uuid
}

// 度转度°分′秒″
export function d2dfm(val) {
  if (typeof (val) == 'undefined' || val == '' || val == null) {
    return ''
  }
  let i = val.indexOf('.')
  let strDu = i < 0 ? val : val.substring(0, i) // 获取度
  let strFen = 0
  let strMiao = 0
  if (i > 0) {
    strFen = '0' + val.substring(i)
    strFen = strFen * 60 + ''
    i = strFen.indexOf('.')
    if (i > 0) {
      strMiao = '0' + strFen.substring(i)
      strFen = strFen.substring(0, i) // 获取分
      strMiao = strMiao * 60 + ''
      i = strMiao.indexOf('.')
      strMiao = strMiao.substring(0, i + 4) // 取到小数点后面三位
      // strMiao = parseFloat(strMiao).toFixed(0) // 精确小数点后面两位
      strMiao = parseInt(strMiao)
    }
  }
  return strDu + '°' + strFen + '\'' + strMiao + '\'\''
}

export function dfm2d(du, fen, miao) {
  if (isEmpty(du) || isEmpty(fen) || isEmpty(miao)) {
    return ''
  }
  const result = du + fen / 60 + miao / 360
  const i = result.toString().indexOf('.')
  return parseFloat(result.toString().substring(0, i + 8))
}

export function isEmpty(str) {
  const result = (str == '' || str == null || str == undefined)
  return result
}
